Introduction
Here is documented the exploratory data analysis of finding recorded sound’s wind dependence. The aim of the analysis is to extract averaged wind dependent spectra of the recorded sound. Besides this band with dominant ship traffic noise are to be determined. Precipitation noise will be analysed in case a good dataset of precipitation data.
- Wind noise dependence curves
- Traffic noise band
- Precipitation noise band
The data description and reading
The sound data was measured during the BIAS project following the BIAS project sound measurement standards. For measurements the digital autonomous acoustic recorders used were the SM2M by Wildlife Acoustics with a HTI-96-Min hydrophone. The hydrophones were calibrated before the deployments. The sensitivity values fron the calibration were used for sound pressure level calculation. According to the manufacturer the the SM2M’s operating frequency band is 2 Hz to 30 kHz (± 2 dB of rated sensitivity).
For calculating the one-third octave band sound pressure levels, modified version of the PAMGuide acoustic analysis software developed by Merchant et al in 2015. The no essential parts of the software was modified. The input was changed to receive data from multiple folders. Also additional parts were written to for saving the output into the ICES required Continuous Noise data reporting HDF5 file format. The temporal analysis window of the data was 20 seconds.
For reading the calculated HDF5 sound data the read_sound function was written inside the read_sound.R file. The function takes as input the location location name B20, B21, B22, B23 to be read, the beginning and end times in character format (‘2014-01-13’) for the time period to be read.
source('read_sound.R')
loc_name <- 'B23' # Location name
beg_date <- '2014-01-01' # Beginning date
end_date <- '2014-02-01' # End date
sound_dat <- read_sound(loc_name, beg_date, end_date)
head(sound_dat, 4) # Show first four lines of the read data
The wind speed data were obtained from the SMHI mesoscale analysis system MESAN. For each sound measurement location wind speeds extracted from the model nodes closest to each monitoring location.
For reading the wind speed data the read_wind_data function was written inside the read_wind_data.R file. The function takes as input the location location name 20, 21, 22, 23 to be read, the beginning and end times in character format (‘2014-01-13’) for the time period to be read.
source('read_wind_data.R')
wind_dat <- read_wind_data(loc_name, beg_date, end_date) # Read wind data
# Plot the wind data
plot(Wind_speed_ms ~ DateTime,
data = wind_dat, type = 'l',
xlab = 'Time', ylab = 'Wind speed [m/s]',
main = paste(loc_name, 'SMHI wind', beg_date, end_date))

The Automatic Identification System (AIS) data processed was originally collected for the purposes of the BIAS project. This data was extracted for spans of 20 km radius around all the sound monitoring locations. Documentation for the AIS data processing is presented in a jupyter notebook AIS_processing_documentation.ipynb. This AIS data was time regularized and a table was created with only the closest ship distance/coordinates at each time step.
Reading the AIS closest ship time series data the read_closest_ais function was written inside the read_closest_ais.R file. The function takes as input the location location name B20, B21, B22, B23 to be read, the beginning and end times in character format (‘2014-01-13’) for the time period to be read.
source('read_closest_ais.R')
ais_dat <- read_closest_ais(loc_name, beg_date, end_date) # Read closest AIS data
head(ais_dat, 4) # Display 4 rows of the data
Integrating data
For analysis the sound level, wind speed, and ship distance data need to be integrated. Data integration means to combine the data that resides from different sources and provide a unified view of the data. For integration R-scripts integrate_ais_sound.R, integrate_sound_wind_ais.R, integrate_wind_sound.R were created that contain functions with same name. The function integrate_sound_wind_ais integrates all the three datasets. For integration the wind speed data was interpolated to have same timestep as the sound data.
source('integrate_sound_wind_ais.R')
sound_wind_ais <- integrate_sound_wind_ais(loc_name, beg_date, end_date)
Warning message:
In if (constCount == length(constBuf)) constBuf <<- .Internal(growconst(constBuf)) :
closing unused connection 3 (AIS_data_processing/AIS_data_interpolated/B23_AIS_closest_ts.csv)
head(sound_wind_ais, 4)
base::closeAllConnections() # Close temporary file created during reading

Correlation plots
For investigating the dependence between the one-third octave band SPLs, the distances to closest ships, and wind speeds one can calculate the correlation coefficients between the different data. A good overview of these correlation coefficients is given by a plot that shows the size of correlation coefficients. This was realised by constructing the function plot_corr in plot_corr.R around the corrplot function from the library corrplot. The plot shows the correlation coefficients with colored circles where both the size and the color of the circles indicate the value of the coefficient. Blue colors correspond to positive correlations and red colors to negitve correlations.
source('plot_corr.R')
pl_title <- paste(loc_name, 'Correlation plot',
gsub('-', '/', beg_date), '-',
gsub('-', '/', substr(end_date, 6, 10)))
plot_corr(sound_wind_ais, pl_title)

2D-density of spectral density levels plots
The sound data processed are the calculated one-third octave band sound pressure levels. These level are presented in units [dB ref. 1\(\mu\)Pa]. The wind dependend spectral curves that are sometimes called as the “Wenz curves” or “Knudsen curves” are presented in Spectrum levels [Poikonen], Noise spectrum levels [Klusek] with units cited as [dB ref 1 \(\mu\)Pa\(^2\)Hz\(^{-1}\)]. The correct full name for this physical quantity according to the ISO underwater acoustics terminology standard [ISO 18045] should be mean-square sound pressure spectral density level.
For making the one-third octave band sound pressure levels (abbr. SPL\(_{1/3}\) and denoted \(L_p^{1/3}\)) comparable with the mean-square sound pressure spectral density levels (abbr. SDL and denoted \(L_{p,f}\)) an equivalent SDL for the frequencies within the one-third octave band (abbr. SDL\(_{1/3}\) and denoted \(L_{p,f}^{1/3}\)) that would amount to the original SPL\(_{1/3}\) can be calculated:
\[L_{p,f}^{1/3} = L_p^{1/3} - 10\log_{10}(\Delta f^{1/3}) \],
where \(\Delta f^{1/3}\) is the width of the one-third octave band for which the \(L_{p,f}^{1/3}\) is calculated.
From these calculated SDL\(_{1/3}\)s values one can compose a 2D-density plot where the number of the appearance of certain SDL\(_{1/3}\) within a certain one-third octave band can be indicated with a color scale.
source('read_sound.R')
source('plot_spec_den.R')
sound_dat <- read_sound(loc_name, beg_date, end_date)
sound_dat <- tob_to_sp_den(sound_dat)
pl_title <- paste(loc_name, '2D-Density of spectral density levels ',
gsub('-', '/', beg_date), '-',
gsub('-', '/', substr(end_date, 6, 10)))
plot_spec_den(sound_dat, pl_title)

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgYW5hbHlzaXMgb2YgdGhlIHNvdW5kIGxldmVsIGRlcGVuZGVuY2Ugb24gd2luZCIKYXV0aG9yOiBNaXJrbyBNdXN0b25lbgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEludHJvZHVjdGlvbgoKSGVyZSBpcyBkb2N1bWVudGVkIHRoZSBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIG9mIGZpbmRpbmcgcmVjb3JkZWQgc291bmQncyB3aW5kIGRlcGVuZGVuY2UuIFRoZSBhaW0gb2YgdGhlIGFuYWx5c2lzIGlzIHRvIGV4dHJhY3QgYXZlcmFnZWQgd2luZCBkZXBlbmRlbnQgc3BlY3RyYSBvZiB0aGUgcmVjb3JkZWQgc291bmQuIEJlc2lkZXMgdGhpcyBiYW5kIHdpdGggZG9taW5hbnQgc2hpcCB0cmFmZmljIG5vaXNlIGFyZSB0byBiZSBkZXRlcm1pbmVkLiBQcmVjaXBpdGF0aW9uIG5vaXNlIHdpbGwgYmUgYW5hbHlzZWQgaW4gY2FzZSBhIGdvb2QgZGF0YXNldCBvZiBwcmVjaXBpdGF0aW9uIGRhdGEuCgoqIFdpbmQgbm9pc2UgZGVwZW5kZW5jZSBjdXJ2ZXMKKiBUcmFmZmljIG5vaXNlIGJhbmQKKiBQcmVjaXBpdGF0aW9uIG5vaXNlIGJhbmQKCiMgVGhlIGRhdGEgZGVzY3JpcHRpb24gYW5kIHJlYWRpbmcKClRoZSBfX3NvdW5kIGRhdGFfXyB3YXMgbWVhc3VyZWQgZHVyaW5nIHRoZSBCSUFTIHByb2plY3QgZm9sbG93aW5nIHRoZSBCSUFTIHByb2plY3Qgc291bmQgbWVhc3VyZW1lbnQgc3RhbmRhcmRzLiBGb3IgbWVhc3VyZW1lbnRzIHRoZSBkaWdpdGFsIGF1dG9ub21vdXMgYWNvdXN0aWMgcmVjb3JkZXJzIHVzZWQgd2VyZSB0aGUgX19TTTJNX18gYnkgX19XaWxkbGlmZSBBY291c3RpY3NfXyB3aXRoIGEgX19IVEktOTYtTWluX18gaHlkcm9waG9uZS4gVGhlIGh5ZHJvcGhvbmVzIHdlcmUgY2FsaWJyYXRlZCBiZWZvcmUgdGhlIGRlcGxveW1lbnRzLiBUaGUgc2Vuc2l0aXZpdHkgdmFsdWVzIGZyb24gdGhlIGNhbGlicmF0aW9uIHdlcmUgdXNlZCBmb3Igc291bmQgcHJlc3N1cmUgbGV2ZWwgY2FsY3VsYXRpb24uIEFjY29yZGluZyB0byB0aGUgbWFudWZhY3R1cmVyIHRoZSB0aGUgU00yTSdzIG9wZXJhdGluZyBmcmVxdWVuY3kgYmFuZCBpcyAyIEh6IHRvIDMwIGtIeiAowrEgMiBkQiBvZiByYXRlZCBzZW5zaXRpdml0eSkuCgpGb3IgY2FsY3VsYXRpbmcgdGhlIG9uZS10aGlyZCBvY3RhdmUgYmFuZCBzb3VuZCBwcmVzc3VyZSBsZXZlbHMsIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIF9fUEFNR3VpZGVfXyBhY291c3RpYyBhbmFseXNpcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgTWVyY2hhbnQgZXQgYWwgaW4gMjAxNS4gVGhlIG5vIGVzc2VudGlhbCBwYXJ0cyBvZiB0aGUgc29mdHdhcmUgd2FzIG1vZGlmaWVkLiBUaGUgaW5wdXQgd2FzIGNoYW5nZWQgdG8gcmVjZWl2ZSBkYXRhIGZyb20gbXVsdGlwbGUgZm9sZGVycy4gQWxzbyBhZGRpdGlvbmFsIHBhcnRzIHdlcmUgd3JpdHRlbiB0byBmb3Igc2F2aW5nIHRoZSBvdXRwdXQgaW50byB0aGUgSUNFUyByZXF1aXJlZCBDb250aW51b3VzIE5vaXNlIGRhdGEgcmVwb3J0aW5nIF9fSERGNV9fIGZpbGUgZm9ybWF0LiBUaGUgdGVtcG9yYWwgYW5hbHlzaXMgd2luZG93IG9mIHRoZSBkYXRhIHdhcyAyMCBzZWNvbmRzLgogICAgICAgIApGb3IgcmVhZGluZyB0aGUgY2FsY3VsYXRlZCBIREY1ICoqc291bmQgZGF0YSoqIHRoZSBfcmVhZF9zb3VuZF8gZnVuY3Rpb24gd2FzIHdyaXR0ZW4gaW5zaWRlIHRoZSBfcmVhZF9zb3VuZC5SXyBmaWxlLiBUaGUgZnVuY3Rpb24gdGFrZXMgYXMgaW5wdXQgdGhlIGxvY2F0aW9uIGxvY2F0aW9uIG5hbWUgX0IyMF8sIF9CMjFfLCBfQjIyXywgX0IyM18gdG8gYmUgcmVhZCwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRpbWVzIGluIGNoYXJhY3RlciBmb3JtYXQgKCcyMDE0LTAxLTEzJykgZm9yIHRoZSB0aW1lIHBlcmlvZCB0byBiZSByZWFkLgoKYGBge3IgUmVhZCBzb3VuZCBkYXRhLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoJ3JlYWRfc291bmQuUicpCmxvY19uYW1lIDwtICdCMjMnICAjIExvY2F0aW9uIG5hbWUKYmVnX2RhdGUgPC0gJzIwMTQtMDEtMDEnICAjIEJlZ2lubmluZyBkYXRlCmVuZF9kYXRlIDwtICcyMDE0LTAyLTAxJyAgIyBFbmQgZGF0ZQpzb3VuZF9kYXQgPC0gcmVhZF9zb3VuZChsb2NfbmFtZSwgYmVnX2RhdGUsIGVuZF9kYXRlKQpoZWFkKHNvdW5kX2RhdCwgNCkgICMgU2hvdyBmaXJzdCBmb3VyIGxpbmVzIG9mIHRoZSByZWFkIGRhdGEKYGBgCgpUaGUgX193aW5kIHNwZWVkIGRhdGFfXyB3ZXJlIG9idGFpbmVkIGZyb20gdGhlIFNNSEkgbWVzb3NjYWxlIGFuYWx5c2lzIHN5c3RlbSBNRVNBTi4gRm9yIGVhY2ggc291bmQgbWVhc3VyZW1lbnQgbG9jYXRpb24gd2luZCBzcGVlZHMgZXh0cmFjdGVkIGZyb20gdGhlIG1vZGVsIG5vZGVzIGNsb3Nlc3QgdG8gZWFjaCBtb25pdG9yaW5nIGxvY2F0aW9uLgoKRm9yIHJlYWRpbmcgdGhlICoqd2luZCBzcGVlZCBkYXRhKiogdGhlIF9yZWFkX3dpbmRfZGF0YV8gZnVuY3Rpb24gd2FzIHdyaXR0ZW4gaW5zaWRlIHRoZSBfcmVhZF93aW5kX2RhdGEuUl8gZmlsZS4gVGhlIGZ1bmN0aW9uIHRha2VzIGFzIGlucHV0IHRoZSBsb2NhdGlvbiBsb2NhdGlvbiBuYW1lIF8yMF8sIF8yMV8sIF8yMl8sIF8yM18gdG8gYmUgcmVhZCwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRpbWVzIGluIGNoYXJhY3RlciBmb3JtYXQgKCcyMDE0LTAxLTEzJykgZm9yIHRoZSB0aW1lIHBlcmlvZCB0byBiZSByZWFkLgoKYGBge3IgUmVhZCB3aW5kIHNwZWVkIGRhdGEsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSAzLjUsIG91dC53aWR0aCA9ICJcXHRleHR3aWR0aCJ9CnNvdXJjZSgncmVhZF93aW5kX2RhdGEuUicpCndpbmRfZGF0IDwtIHJlYWRfd2luZF9kYXRhKGxvY19uYW1lLCBiZWdfZGF0ZSwgZW5kX2RhdGUpICMgUmVhZCB3aW5kIGRhdGEKIyBQbG90IHRoZSB3aW5kIGRhdGEKcGxvdChXaW5kX3NwZWVkX21zIH4gRGF0ZVRpbWUsIAogICAgIGRhdGEgPSB3aW5kX2RhdCwgdHlwZSA9ICdsJywgCiAgICAgeGxhYiA9ICdUaW1lJywgeWxhYiA9ICdXaW5kIHNwZWVkIFttL3NdJywgCiAgICAgbWFpbiA9IHBhc3RlKGxvY19uYW1lLCAnU01ISSB3aW5kJywgYmVnX2RhdGUsIGVuZF9kYXRlKSkKYGBgCgpUaGUgX19BdXRvbWF0aWMgSWRlbnRpZmljYXRpb24gU3lzdGVtIChBSVMpIGRhdGFfXyBwcm9jZXNzZWQgd2FzIG9yaWdpbmFsbHkgY29sbGVjdGVkIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIEJJQVMgcHJvamVjdC4gVGhpcyBkYXRhIHdhcyBleHRyYWN0ZWQgZm9yIHNwYW5zIG9mIDIwIGttIHJhZGl1cyBhcm91bmQgYWxsIHRoZSBzb3VuZCBtb25pdG9yaW5nIGxvY2F0aW9ucy4gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFJUyBkYXRhIHByb2Nlc3NpbmcgaXMgcHJlc2VudGVkIGluIGEganVweXRlciBub3RlYm9vayBfQUlTX3Byb2Nlc3NpbmdfZG9jdW1lbnRhdGlvbi5pcHluYl8uIFRoaXMgQUlTIGRhdGEgd2FzIHRpbWUgcmVndWxhcml6ZWQgYW5kIGEgdGFibGUgd2FzIGNyZWF0ZWQgd2l0aCBvbmx5IHRoZSBjbG9zZXN0IHNoaXAgZGlzdGFuY2UvY29vcmRpbmF0ZXMgYXQgZWFjaCB0aW1lIHN0ZXAuCgohW19fRmlndXJlIDE6X18gRmlndXJlIHRha2VuIGZyb20gYXJ0aWNsZSBbTXVzdG9uZW4gMjAyMF0uIF9fQSlfXyAtIE1hcCB3aXRoIHRoZSBFc3RvbmlhbiBCSUFTIHNvdW5kIG1vbml0b3JpbmcgbG9jYXRpb25zICgyMCwgMjEsIDIyLCAyMykuIFRoZSBjb2xvdXJlZCBjaXJjbGVzIHNob3cgdGhlIHRpbWUtcmVndWxhcmlzZWQgYXZlcmFnZWQgbnVtYmVyIG9mIEFJUyBiYXNlZCBzaGlwIGxvY2F0aW9uIHBvaW50cyBpbiByZWd1bGFyIDEga21eMiBzcXVhcmVzIHBlciBob3VyIGluIEphbnVhcnkgMjAxNC4gX19CKV9fIC0gQUlTIGJhc2VkIGF2ZXJhZ2VkIGxpa2VseSB2ZXNzZWwgcHJlc2VuY2UgYXQgZGlmZmVyZW50IHJhbmdlcyBmcm9tIHRoZSBtb25pdG9yaW5nIGxvY2F0aW9uIGluICAyMDE0Ll0oRmlndXJlcy9Eb2NfZmlncy9GaWd1cmUxLnBuZyl7d2lkdGg9NzAlXFx0ZXh0d2lkdGh9CgpSZWFkaW5nIHRoZSAqKkFJUyBjbG9zZXN0IHNoaXAgdGltZSBzZXJpZXMgZGF0YSoqIHRoZSBfcmVhZF9jbG9zZXN0X2Fpc18gZnVuY3Rpb24gd2FzIHdyaXR0ZW4gaW5zaWRlIHRoZSBfcmVhZF9jbG9zZXN0X2Fpcy5SXyBmaWxlLiBUaGUgZnVuY3Rpb24gdGFrZXMgYXMgaW5wdXQgdGhlIGxvY2F0aW9uIGxvY2F0aW9uIG5hbWUgX0IyMF8sIF9CMjFfLCBfQjIyXywgX0IyM18gdG8gYmUgcmVhZCwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHRpbWVzIGluIGNoYXJhY3RlciBmb3JtYXQgKCcyMDE0LTAxLTEzJykgZm9yIHRoZSB0aW1lIHBlcmlvZCB0byBiZSByZWFkLgoKYGBge3IgUmVhZCBjbG9zZXN0IEFJUyBkYXRhLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoJ3JlYWRfY2xvc2VzdF9haXMuUicpCmFpc19kYXQgPC0gcmVhZF9jbG9zZXN0X2Fpcyhsb2NfbmFtZSwgYmVnX2RhdGUsIGVuZF9kYXRlKSAgIyBSZWFkIGNsb3Nlc3QgQUlTIGRhdGEKaGVhZChhaXNfZGF0LCA0KSAgIyBEaXNwbGF5IDQgcm93cyBvZiB0aGUgZGF0YQpgYGAKYGBge3IgUGxvdCBjbG9zZXN0IGRpc3RhbmNlLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTMuNSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZHlncmFwaHMpCmxpYnJhcnkoeHRzKQoKYWlzX2RhdCA8LSBzdWJzZXQoYWlzX2RhdCwgc2VsZWN0ID0gYyhEYXRlVGltZSwgRGlzdGFuY2UpKQphaXNfZGF0X3RzIDwtIHh0cyhhaXNfZGF0WywtMV0sIG9yZGVyLmJ5ID0gYWlzX2RhdFsgLDFdKQoKZHlncmFwaChhaXNfZGF0X3RzLCB5bGFiID0gIkNsb3Nlc3Qgc2hpcCBkaXN0YW5jZSBba21dIiwgbWFpbiA9IHBhc3RlKGxvY19uYW1lLCBiZWdfZGF0ZSwgZW5kX2RhdGUpKSAgJT4lIGR5UmFuZ2VTZWxlY3RvcigpCmBgYAoKYGBge3IgUmVtb3ZlIGFsbCBidXQgZmV3LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpybShsaXN0ID0gc2V0ZGlmZihscygpLCBjKCdsb2NfbmFtZScsICdiZWdfZGF0ZScsICdlbmRfZGF0ZScpKSkgIyBSZW1vdmUgYWxsIGJ1dCBvbmUKYGBgCgojIEludGVncmF0aW5nIGRhdGEKCkZvciBhbmFseXNpcyB0aGUgc291bmQgbGV2ZWwsIHdpbmQgc3BlZWQsIGFuZCBzaGlwIGRpc3RhbmNlIGRhdGEgbmVlZCB0byBiZSBpbnRlZ3JhdGVkLiBEYXRhIGludGVncmF0aW9uIG1lYW5zIHRvIGNvbWJpbmUgdGhlIGRhdGEgdGhhdCByZXNpZGVzIGZyb20gZGlmZmVyZW50IHNvdXJjZXMgYW5kIHByb3ZpZGUgYSB1bmlmaWVkIHZpZXcgb2YgdGhlIGRhdGEuIEZvciBpbnRlZ3JhdGlvbiBSLXNjcmlwdHMgX2ludGVncmF0ZV9haXNfc291bmQuUl8sIF9pbnRlZ3JhdGVfc291bmRfd2luZF9haXMuUl8sIF9pbnRlZ3JhdGVfd2luZF9zb3VuZC5SXyB3ZXJlIGNyZWF0ZWQgdGhhdCBjb250YWluIGZ1bmN0aW9ucyB3aXRoIHNhbWUgbmFtZS4gVGhlIGZ1bmN0aW9uIF9pbnRlZ3JhdGVfc291bmRfd2luZF9haXNfIGludGVncmF0ZXMgYWxsIHRoZSB0aHJlZSBkYXRhc2V0cy4gRm9yIGludGVncmF0aW9uIHRoZSB3aW5kIHNwZWVkIGRhdGEgd2FzIGludGVycG9sYXRlZCB0byBoYXZlIHNhbWUgdGltZXN0ZXAgYXMgdGhlIHNvdW5kIGRhdGEuCgpgYGB7ciBJbnRlZ3JhdGUgd2luZCBBSVMgYW5kIHNvdW5kLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoJ2ludGVncmF0ZV9zb3VuZF93aW5kX2Fpcy5SJykKc291bmRfd2luZF9haXMgPC0gaW50ZWdyYXRlX3NvdW5kX3dpbmRfYWlzKGxvY19uYW1lLCBiZWdfZGF0ZSwgZW5kX2RhdGUpCmhlYWQoc291bmRfd2luZF9haXMsIDQpCmJhc2U6OmNsb3NlQWxsQ29ubmVjdGlvbnMoKSAgIyBDbG9zZSB0ZW1wb3JhcnkgZmlsZSBjcmVhdGVkIGR1cmluZyByZWFkaW5nCmBgYAoKYGBge3IgUGxvdCB0d28gb2YgdGhlIGRlcGVuZGVuY2llcywgZWNobz1GQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICJcXHRleHR3aWR0aCJ9CnBhcihtZnJvdyA9IGMoMiwxKSkKcGxvdCh4ID0gc291bmRfd2luZF9haXMkV1NfbXMsIHkgPSBzb3VuZF93aW5kX2FpcyR0b2JfNTAwMCwgCiAgICAgcGNoID0gMjAsIGNvbCA9IHJnYigwLDAsMCwgYWxwaGEgPSAwLjA3KSwKICAgICB4bGFiID0gJ1dpbmQgc3BlZWQgW20vc10nLCAKICAgICB5bGFiID0gJzUwMDAgSHogMS8zIG9jdC4gU1BMIFtkQiByZSAxIHVQYV0nLAogICAgIG1haW4gPSBwYXN0ZShsb2NfbmFtZSwgYmVnX2RhdGUsIGVuZF9kYXRlKSkKcGxvdCh4ID0gc291bmRfd2luZF9haXMkRGlzdGFuY2UsIHkgPSBzb3VuZF93aW5kX2FpcyR0b2JfNjMsIAogICAgIHBjaCA9IDIwLCBjb2wgPSByZ2IoMCwwLDAsIGFscGhhID0gMC4wNyksCiAgICAgeGxhYiA9ICdDbG9zZXN0IHNoaXAgZGlzdGFuY2UgW2ttXScsIAogICAgIHlsYWIgPSAnNjMgSHogMS8zIG9jdC4gU1BMIFtkQiByZSAxIHVQYV0nKQpwYXIobWZyb3cgPSBjKDEsMSkpCmBgYApgYGB7ciBSZW1vdmUgYWxsIGJ1dCBmZXcgMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kcm0obGlzdCA9IHNldGRpZmYobHMoKSwgYygnbG9jX25hbWUnLCAnYmVnX2RhdGUnLCAnZW5kX2RhdGUnLCAnc291bmRfd2luZF9haXMnKSkpICMgUmVtb3ZlIGFsbCBidXQgb25lCmBgYAoKIyBDb3JyZWxhdGlvbiBwbG90cwoKRm9yIGludmVzdGlnYXRpbmcgdGhlIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGUgb25lLXRoaXJkIG9jdGF2ZSBiYW5kIFNQTHMsIHRoZSBkaXN0YW5jZXMgdG8gY2xvc2VzdCBzaGlwcywgYW5kIHdpbmQgc3BlZWRzIG9uZSBjYW4gY2FsY3VsYXRlIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYmV0d2VlbiB0aGUgZGlmZmVyZW50IGRhdGEuIEEgZ29vZCBvdmVydmlldyBvZiB0aGVzZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgaXMgZ2l2ZW4gYnkgYSBwbG90IHRoYXQgc2hvd3MgdGhlIHNpemUgb2YgY29ycmVsYXRpb24gY29lZmZpY2llbnRzLiBUaGlzIHdhcyByZWFsaXNlZCBieSBjb25zdHJ1Y3RpbmcgdGhlIGZ1bmN0aW9uIF9wbG90X2NvcnJfIGluIF9wbG90X2NvcnIuUl8gYXJvdW5kIHRoZSBjb3JycGxvdCBmdW5jdGlvbiBmcm9tIHRoZSBsaWJyYXJ5IGNvcnJwbG90LiBUaGUgcGxvdCBzaG93cyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIHdpdGggY29sb3JlZCBjaXJjbGVzIHdoZXJlIGJvdGggdGhlIHNpemUgYW5kIHRoZSBjb2xvciBvZiB0aGUgY2lyY2xlcyBpbmRpY2F0ZSB0aGUgdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50LiBCbHVlIGNvbG9ycyBjb3JyZXNwb25kIHRvIHBvc2l0aXZlIGNvcnJlbGF0aW9ucyBhbmQgcmVkIGNvbG9ycyB0byBuZWdpdHZlIGNvcnJlbGF0aW9ucy4KCmBgYHtyIFBsb3QgY29ycmVsYXRpb24gb2YgYWlzIGFuZCBzb3VuZCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIwLjdcXHRleHR3aWR0aCJ9CnNvdXJjZSgncGxvdF9jb3JyLlInKQpwbF90aXRsZSA8LSBwYXN0ZShsb2NfbmFtZSwgJ0NvcnJlbGF0aW9uIHBsb3QnLCAKICAgICAgICAgICAgICAgICAgZ3N1YignLScsICcvJywgYmVnX2RhdGUpLCAnLScsIAogICAgICAgICAgICAgICAgICBnc3ViKCctJywgJy8nLCBzdWJzdHIoZW5kX2RhdGUsIDYsIDEwKSkpCnBsb3RfY29ycihzb3VuZF93aW5kX2FpcywgcGxfdGl0bGUpCmBgYAoKYGBge3IgUmVtb3ZlIGFsbCBidXQgZmV3IDMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnJtKGxpc3QgPSBzZXRkaWZmKGxzKCksIGMoJ2xvY19uYW1lJywgJ2JlZ19kYXRlJywgJ2VuZF9kYXRlJykpKSAjIFJlbW92ZSBhbGwgYnV0IG9uZQpgYGAKCiMgMkQtZGVuc2l0eSBvZiBzcGVjdHJhbCBkZW5zaXR5IGxldmVscyBwbG90cwoKVGhlIHNvdW5kIGRhdGEgcHJvY2Vzc2VkIGFyZSB0aGUgY2FsY3VsYXRlZCBvbmUtdGhpcmQgb2N0YXZlIGJhbmQgc291bmQgcHJlc3N1cmUgbGV2ZWxzLiBUaGVzZSBsZXZlbCBhcmUgcHJlc2VudGVkIGluIHVuaXRzIFtkQiByZWYuIDEkXG11JFBhXS4gVGhlIHdpbmQgZGVwZW5kZW5kIHNwZWN0cmFsIGN1cnZlcyB0aGF0IGFyZSBzb21ldGltZXMgY2FsbGVkIGFzIHRoZSBfIldlbnogY3VydmVzIl8gb3IgXyJLbnVkc2VuIGN1cnZlcyJfIGFyZSBwcmVzZW50ZWQgaW4gU3BlY3RydW0gbGV2ZWxzIFtQb2lrb25lbl0sIE5vaXNlIHNwZWN0cnVtIGxldmVscyBbS2x1c2VrXSB3aXRoIHVuaXRzIGNpdGVkIGFzIFtkQiByZWYgMSAkXG11JFBhJF4yJEh6JF57LTF9JF0uIFRoZSBjb3JyZWN0IGZ1bGwgbmFtZSBmb3IgdGhpcyBwaHlzaWNhbCBxdWFudGl0eSBhY2NvcmRpbmcgdG8gdGhlIElTTyB1bmRlcndhdGVyIGFjb3VzdGljcyB0ZXJtaW5vbG9neSBzdGFuZGFyZCBbSVNPIDE4MDQ1XSBzaG91bGQgYmUgX19tZWFuLXNxdWFyZSBzb3VuZCBwcmVzc3VyZSBzcGVjdHJhbCBkZW5zaXR5IGxldmVsX18uIAoKRm9yIG1ha2luZyB0aGUgb25lLXRoaXJkIG9jdGF2ZSBiYW5kIHNvdW5kIHByZXNzdXJlIGxldmVscyAoYWJici4gU1BMJF97MS8zfSQgYW5kIGRlbm90ZWQgJExfcF57MS8zfSQpIGNvbXBhcmFibGUgd2l0aCB0aGUgbWVhbi1zcXVhcmUgc291bmQgcHJlc3N1cmUgc3BlY3RyYWwgZGVuc2l0eSBsZXZlbHMgKGFiYnIuIFNETCBhbmQgZGVub3RlZCAkTF97cCxmfSQpIGFuIGVxdWl2YWxlbnQgU0RMIGZvciB0aGUgZnJlcXVlbmNpZXMgd2l0aGluIHRoZSBvbmUtdGhpcmQgb2N0YXZlIGJhbmQgKGFiYnIuIFNETCRfezEvM30kIGFuZCBkZW5vdGVkICRMX3twLGZ9XnsxLzN9JCkgdGhhdCB3b3VsZCBhbW91bnQgdG8gdGhlIG9yaWdpbmFsIFNQTCRfezEvM30kIGNhbiBiZSBjYWxjdWxhdGVkOgoKJCRMX3twLGZ9XnsxLzN9ID0gTF9wXnsxLzN9IC0gMTBcbG9nX3sxMH0oXERlbHRhIGZeezEvM30pICQkLAoKd2hlcmUgJFxEZWx0YSBmXnsxLzN9JCBpcyB0aGUgd2lkdGggb2YgdGhlIG9uZS10aGlyZCBvY3RhdmUgYmFuZCBmb3Igd2hpY2ggdGhlICRMX3twLGZ9XnsxLzN9JCBpcyBjYWxjdWxhdGVkLiAKCkZyb20gdGhlc2UgY2FsY3VsYXRlZCBTREwkX3sxLzN9JHMgdmFsdWVzIG9uZSBjYW4gY29tcG9zZSBhIDJELWRlbnNpdHkgcGxvdCB3aGVyZSB0aGUgbnVtYmVyIG9mIHRoZSBhcHBlYXJhbmNlIG9mIGNlcnRhaW4gU0RMJF97MS8zfSQgd2l0aGluIGEgY2VydGFpbiBvbmUtdGhpcmQgb2N0YXZlIGJhbmQgY2FuIGJlIGluZGljYXRlZCB3aXRoIGEgY29sb3Igc2NhbGUuCgpgYGB7ciBQbG90IHNwZWN0cmFsIGRlbnNpdHkgb2Ygc291bmQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNvdXJjZSgncmVhZF9zb3VuZC5SJykKc291cmNlKCdwbG90X3NwZWNfZGVuLlInKQpzb3VuZF9kYXQgPC0gcmVhZF9zb3VuZChsb2NfbmFtZSwgYmVnX2RhdGUsIGVuZF9kYXRlKQpzb3VuZF9kYXQgPC0gdG9iX3RvX3NwX2Rlbihzb3VuZF9kYXQpCgpwbF90aXRsZSA8LSBwYXN0ZShsb2NfbmFtZSwgJzJELURlbnNpdHkgb2Ygc3BlY3RyYWwgZGVuc2l0eSBsZXZlbHMgJywgCiAgICAgICAgICAgICAgICAgIGdzdWIoJy0nLCAnLycsIGJlZ19kYXRlKSwgJy0nLCAKICAgICAgICAgICAgICAgICAgZ3N1YignLScsICcvJywgc3Vic3RyKGVuZF9kYXRlLCA2LCAxMCkpKQoKcGxvdF9zcGVjX2Rlbihzb3VuZF9kYXQsIHBsX3RpdGxlKQpgYGA=